package com.helin.helinhealth.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.helin.helinhealth.entity.User;
import com.helin.helinhealth.service.AuthService;
import com.helin.helinhealth.utils.JwtUtils;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.helin.helinhealth.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

/**
 * 认证服务实现类
 * 
 * <p>
 * 该类实现了AuthService接口定义的所有方法，
 * 主要处理微信小程序登录认证、JWT令牌生成与验证等功能。
 * </p>
 */
@Slf4j
@Service
public class AuthServiceImpl extends ServiceImpl<UserMapper, User> implements AuthService {

    /**
     * 微信小程序服务对象
     */
    @Autowired
    private WxMaService wxMaService;
    
    /**
     * JWT工具类
     */
    @Autowired
    private JwtUtils jwtUtils;
    
    /**
     * 微信小程序登录
     * 
     * @param code 微信小程序登录时获取的临时登录凭证
     * @return JWT令牌
     */
    @Override
    @Transactional
    public String wechatLogin(String code) {
        try {
            // 通过code获取微信用户openid和session_key
            WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code);
            String openid = sessionInfo.getOpenid();
            
            log.info("微信小程序用户登录成功，openid: {}", openid);
            
            // 查询用户是否已存在
            User user = getUserByOpenid(openid);
            
            // 如果用户不存在，则创建新用户
            if (user == null) {
                user = new User();
                user.setOpenid(openid);
                user.setRole(1); // 默认为老人角色
                // 保存新用户
                save(user);
                log.info("新用户注册成功，openid: {}", openid);
            }
            
            // 生成JWT令牌返回给客户端
            return jwtUtils.generateToken(openid);
        } catch (WxErrorException e) {
            log.error("微信登录失败: {}", e.getMessage(), e);
            throw new RuntimeException("微信登录失败: " + e.getMessage());
        }
    }
    
    /**
     * 根据openid获取用户信息
     * 
     * @param openid 微信用户的唯一标识
     * @return 用户信息对象
     */
    @Override
    public User getUserByOpenid(String openid) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getOpenid, openid);
        queryWrapper.eq(User::getIsDeleted, 0); // 未删除的用户
        return getOne(queryWrapper);
    }
    
    /**
     * 保存或更新用户信息
     * 
     * @param user 用户信息对象
     * @return 是否操作成功
     */
    @Override
    @Transactional
    public boolean saveOrUpdateUser(User user) {
        // 检查用户是否已存在
        User existUser = getUserByOpenid(user.getOpenid());
        
        if (existUser != null) {
            // 用户已存在，更新信息
            user.setUpdateTime(LocalDateTime.now());
            return updateById(user);
        } else {
            // 用户不存在，创建新用户
            user.setCreateTime(LocalDateTime.now());
            user.setUpdateTime(LocalDateTime.now());
            return save(user);
        }
    }
    
    /**
     * 验证JWT令牌是否有效
     * 
     * @param token JWT令牌字符串
     * @return 是否有效
     */
    @Override
    public boolean validateToken(String token) {
        return jwtUtils.validateToken(token);
    }
    
    /**
     * 从JWT令牌中获取用户openid
     * 
     * @param token JWT令牌字符串
     * @return 用户openid
     */
    @Override
    public String getOpenidFromToken(String token) {
        return jwtUtils.extractOpenid(token);
    }
}
